package com.panda.controller;/**
 * @author 乐于吕
 * * @date 2024/10/17
 */

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;



/**
 * @Author: 乐于吕
 * @CreateTime: 2024-10-17
 * @Description: Hystrix  服务调用出现异常  则会直接通过follback实现快速响应
 * 给服务的调用方  返回一个可处理  符合预期的结果  让资源得到及时的释放
 *
 * 当请求的异常比例达到一定的阈值，hystrix可以将该服务熔断
 * 1、10秒内超过20个请求失败
 * 2、10秒内超过50%的请求失败
 *
 * 到达阀值后服务被熔断，熔断后的服务会被保护5s时间，
 * 在5s内该服务被隔离，任何请求都会被进行快速响应
 * 保护时间结束后，服务状态进入半开状态，允许进入一次请求到目标服务
 * 如果请求成功，则恢复服务，如果请求失败，则继续熔断
 *
 * 1、  当满足一定的阀值的时候（默认10秒内超过20个请求失败）
 *
 * 2、  当失败率达到一定的时候（默认10秒内超过50%的请求失败）
 *
 * 3、  到达以上阀值，断路器将会开启
 *
 * 4、  当开启的时候，所有请求都不会进行转发
 *
 * 5、  一段时间之后（默认是5秒），这个时候断路器是半开状态，会让其中一个请求进行转发。
 *      如果成功，断路器会关闭，若失败，继续开启。重复4和5。
 *
 * *
 */

@RestController
@RequestMapping("/hystrix")
public class HystrixController {

    @GetMapping("/m1")
    @HystrixCommand(fallbackMethod = "method1Fallback")
    public String method1(Integer id) {
        System.out.println("method1  id = " + id);
        if (id < 0) {
            throw new RuntimeException("id不能为负数,id = " + id);
        }
        return "HystrixController  method1  success  id = " + id;
    }

    //快速响应方法  快速响应方法设计时要保持和原方法的参数和返回值类型一致
    //在快速响应方法被调用时  会将原方法的参数传入
    public String method1Fallback(Integer id) {
        System.out.println("method1Fallback  id = " + id);
        return "HystrixController  method1  error , 参数异常：id = " + id;
    }


}
